package JZOffer;

/**
 * 剑指 Offer 34. 二叉树中和为某一值的路径
 * 输入一棵二叉树和一个整数，打印出二叉树中节点值的和为输入整数的所有路径。
 * 从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
 * **/

import java.util.LinkedList;
import java.util.List;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution34 {
    //res存放所有满足条件的路径
    LinkedList<List<Integer>> res = new LinkedList<>();
    //path存放正在遍历的路径
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> pathSum(TreeNode root, int target) {
        findPath(root, target, 0);
        return res;
    }

    public void findPath(TreeNode root, int tar, int curpathSum) {
        //访问到叶子节点时返回
        if (root == null) return;
        //把当前节点加入到路径中
        path.add(root.val);
        //同时加入该节点的值
        curpathSum += root.val;

        // 1、当前节点为叶子节点
        // 2、路径中所有节点的值之和等于输入的目标值
        // 当前路径符合要求，把路径加入到结果数组中
        if (tar == curpathSum && root.left == null && root.right == null) {
            res.add(new LinkedList(path));
        }

        //访问他的左子节点
        findPath(root.left, tar, curpathSum);
        //访问他的右子节点
        findPath(root.right, tar, curpathSum);
        //访问完当前节点，需要删除路径中的最后一个节点，回退至父节点
        path.removeLast();
    }
}